package com.wxh.bomb.netty.echo.server;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

/**
 * 服务适配器：
 * 控制服务到客户端的调用流程，确定异步调用的时机
 *
 * @author wxh
 * @date：2017.10.19
 */
public class EchoServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 被调用的客户端和服务器连接已经建立，且有消息传入进来
     *
     * @param ctx 处理链中所传输交换信息的上下文
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        try {
//            使用拆包粘包之后为String对象
//            ByteBuf buf = (ByteBuf) msg;
//            byte[] req = new byte[buf.readableBytes()];
//            buf.readBytes(req);
//            String body = new String(req, "utf-8");
            String body = (String) msg;
            System.out.println("=======================================================");
            System.out.println("Server receive:" + body);
            System.out.println("=======================================================");
            String response = body + "$_";
            ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes()));
//                    .addListener(ChannelFutureListener.CLOSE);// 实现短链接
        } finally {
            // 释放
            ReferenceCountUtil.release(msg);
        }
    }

    /**
     * 通道信息是否全部写入，通过监听器的思想来实现
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 将通道中的缓冲，尝试全部写出套接字
        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER);
        //.addListener(ChannelFutureListener.CLOSE);// 实现短链接
    }

    /**
     * 自定义处理异常
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        // 异常处理
        System.out.println(ctx.channel().remoteAddress() + " exception info:" + cause.getMessage());
        // 关闭通道
        ctx.close();
    }
}